package com.shuigu.ai.config;

import com.shuigu.ai.monitor.AiModelMonitorListener;
import dev.langchain4j.model.chat.StreamingChatModel;
import dev.langchain4j.model.openai.OpenAiChatRequestParameters;
import dev.langchain4j.model.openai.OpenAiStreamingChatModel;
import jakarta.annotation.Resource;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Scope;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 推理专用流式模型配置
 */
@Configuration
@ConfigurationProperties(prefix = "langchain4j.open-ai.reasoning-streaming-chat-model")
@Data
public class ReasoningStreamingChatModelConfig {

    private String baseUrl;

    private String apiKey;

    private String modelName;

    private Integer maxTokens;

    private Double temperature;

    private boolean logRequests = false;

    private boolean logResponses = false;

    private boolean returnThinking = false;

    private boolean enableSearch = false;

    @Resource
    private AiModelMonitorListener aiModelMonitorListener;

    /**
     * 推理流式模型（用于 Vue 项目生成，带工具调用）
     * 用于复杂推理任务
     */
    @Bean
    @Scope("prototype")
    public StreamingChatModel customizeStreamingChatModel() {

        // 启用深度思考模式（设置enable_thinking=True）
        boolean enableThinking = returnThinking;

        // 构建自定义参数
        Map<String, Object> customParameters = new HashMap<>();
        customParameters.put("enable_thinking", enableThinking);
        /**
         * 模型在生成文本时是否使用互联网搜索结果进行参考。取值如下：
         *
         * true：启用互联网搜索，模型会将搜索结果作为文本生成过程中的参考信息，但模型会基于其内部逻辑判断是否使用互联网搜索结果。
         *
         * 如果模型没有搜索互联网，建议优化Prompt，或设置search_options中的forced_search参数开启强制搜索。
         * false（默认）：关闭互联网搜索。
         *
         * 启用互联网搜索功能可能会增加 Token 的消耗。
         * 若您通过 Python SDK调用，请通过extra_body配置。配置方式为：extra_body={"enable_search": True}。
         */
        customParameters.put("enable_search", enableSearch);
        HashMap<String, Object> searchParameters = new HashMap<>();
        // 强制联网搜索
        searchParameters.put("forced_search", false);
        customParameters.put("search_options", searchParameters);

        // 构建请求参数
        OpenAiChatRequestParameters parameters = OpenAiChatRequestParameters.builder()
                .modelName(modelName)
                .customParameters(customParameters)
                .build();

        return OpenAiStreamingChatModel.builder()
                .apiKey(apiKey)
                .baseUrl(baseUrl)
                .defaultRequestParameters(parameters)
                .maxTokens(maxTokens)
                .temperature(temperature)
                .logRequests(logRequests)
                .logResponses(logResponses)
                .returnThinking(returnThinking)
                .listeners(List.of(aiModelMonitorListener))
                .build();
    }
}
